package com.atguigu.xiaozhi.tools;

import com.atguigu.xiaozhi.domain.Appointment;
import com.atguigu.xiaozhi.service.AppointmentService;
import dev.langchain4j.agent.tool.P;
import dev.langchain4j.agent.tool.Tool;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * @author kkdulx
 * @date 2025/10/27
 */

@Component
public class AppointmentTools {
    @Autowired
    private AppointmentService  appointmentService;

    @Tool(name = "预约挂号", value = "根据参数，先执行工具方法 [查询是否有号源] 查询是否可预约，并直接给用户回答是否可预约，并让用户确认所有预约信息，用户确认后再进行预约。")
    public String bookAppointment(Appointment  appointment){
        // 查询用户在当前时间是否已有预约信息
        Appointment appointmentServiceOne= appointmentService.getOne(appointment);
        if(appointmentServiceOne == null) {
            appointment.setId( null);
            boolean result = appointmentService.save(appointment);
            if (result) {
                return "预约成功,并返回预约详情";
            } else {
                return "预约失败,请重新预约";
            }
        }
        return "您已预约过该时间段，请勿重复预约";
    }

    @Tool(name = "取消预约挂号", value = "根据参数，查询预约是否存在，如果存在则删除预约记录并返回预约成功，否则返回预约失败")
    public String cancelAppointment(Appointment  appointment){
        Appointment appointmentServiceOne= appointmentService.getOne(appointment);
        if(appointmentServiceOne != null) {
            boolean result = appointmentService.removeById(appointment.getId());
            if (result) {
                return "取消预约成功";
            } else {
                return "取消预约失败";
            }
        }
        return "您没有预约过该时间段，请勿重复取消";
    }

    @Tool(name = "查询是否有号源", value = "名称，日期，时间和医生查询是否有号源，并返回给用户。true是可以预约，false是不可以预约")
    public boolean queryAppointment(
            @P(value = "科室名称") String name,
            @P(value = "预约日期") String date,
            @P(value = "预约时间，可选择：上午、下午") String time,
            @P(value = "医生名称", required = false) String doctorName
            ){

        //TODO 维护医生的排班信息：

        //如果没有指定医生名字，则根据其他条件查询是否有可以预约的医生（有返回true，否则返回false）；
        //如果指定了医生名字，则判断医生是否有排班（没有排版返回false）
        //如果有排班，则判断医生排班时间段是否已约满（约满返回false，有空闲时间返回true）

        return true;
    }
}
